/** @file

Module Name:

  FSInject.h

  Definitions for private EFI_SIMPLE_FILE_SYSTEM_PROTOCOL and EFI_FILE_PROTOCOL implementations.

  initial version - dmazar

**/

#ifndef __FSInject_H__
#define __FSInject_H__

// DBG_TO: 0=no debug, 1=serial, 2=console
// serial requires
// [PcdsFixedAtBuild]
//  gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x07
//  gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xFFFFFFFF
// in package DSC file

#ifdef DEBUG_FSINJECT
#define DBG_TO DEBUG_FSINJECT
#else
#define DBG_TO -1
#endif

#if DBG_TO == 4
#define DBG(...) MemLog(TRUE, 1, __VA_ARGS__)
#elif DBG_TO == 3
#define DBG(...) MemLog(FALSE, 0, __VA_ARGS__)
#elif DBG_TO == 2
#define DBG(...) AsciiPrint(__VA_ARGS__)
#elif DBG_TO == 1
#define DBG(...) DebugPrint(1, __VA_ARGS__)
#else
#define DBG(...)
#endif

/**
 * FSInjection EFI_SIMPLE_FILE_SYSTEM_PROTOCOL private structure
 */
typedef struct {
  UINT64                            Signature;    // identification signature

  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL   FS;       // public EFI_SIMPLE_FILE_SYSTEM_PROTOCOL

  EFI_HANDLE                        *TgtHandle;   // target handle we are attached to
  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL   *TgtFS;     // target FS we are replacing
  CHAR16                            *TgtDir;    // target dir where injection will be done

  EFI_HANDLE                        *SrcHandle;   // handle where injection dir is
  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL   *SrcFS;     // FS with injection dir we are replacing
  CHAR16                            *SrcDir;    // injection dir that contains files that will be injected into TgtDir

  FSI_STRING_LIST                   *Blacklist;   // linked list of file names to be blocked on target volume
  FSI_STRING_LIST                   *ForceLoadKexts;// linked list of kext plists
} FSI_SIMPLE_FILE_SYSTEM_PROTOCOL;

/** Signature for FSI_SIMPLE_FILE_SYSTEM_PROTOCOL */
#define FSI_SIMPLE_FILE_SYSTEM_PROTOCOL_SIGNATURE  SIGNATURE_32('f', 'i', 'f', 's')

/** Macro to access FSI_SIMPLE_FILE_SYSTEM_PROTOCOL from public FS */
#define FSI_FROM_SIMPLE_FILE_SYSTEM(a)  CR (a, FSI_SIMPLE_FILE_SYSTEM_PROTOCOL, FS, FSI_SIMPLE_FILE_SYSTEM_PROTOCOL_SIGNATURE)

/**
 *  FSInjection EFI_FILE_PROTOCOL private structure.
 */
typedef struct {
  UINT64                              Signature;    // identification signature

  EFI_FILE_PROTOCOL                   FP;       // public EFI_FILE_PROTOCOL

  FSI_SIMPLE_FILE_SYSTEM_PROTOCOL     *FSI_FS;    // FS protocol that created this structure
  CHAR16                              *FName;     // file name this structure represents
  BOOLEAN                             IsDir;      // true after GetInfo if this file is directory
  EFI_FILE_PROTOCOL                   *TgtFP;     // target EFI_FILE_PROTOCOL
  EFI_FILE_PROTOCOL                   *SrcFP;     // EFI_FILE_PROTOCOL from injection volume
  BOOLEAN                             FromTgt;    // TRUE if file is opened from original target volume, FALSE if from injection volume
} FSI_FILE_PROTOCOL;

/** Signature for FSI_FILE_PROTOCOL */
#define FSI_FILE_PROTOCOL_SIGNATURE  SIGNATURE_32('f', 'i', 'f', 'p')

/** Macro to access FSI_FILE_PROTOCOL from public FP */
#define FSI_FROM_FILE_PROTOCOL(a)  CR (a, FSI_FILE_PROTOCOL, FP, FSI_FILE_PROTOCOL_SIGNATURE)

#endif
